﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace FGK
{
    class Sfera : Obiekt
    {
        private Wektor srodek;
        private float promien;

        public override Wektor normalna(Wektor punkt)
        {
            Wektor w = new Wektor(punkt-this.srodek);
            w.normalize();
            return w;
        }

        public Sfera(float a, float b, float c, float r)
        {
            srodek = new Wektor(a, b, c);
            promien = r;
        }

        public Sfera(Wektor v, float r)
        {
            srodek = v;
            promien = r;
        }

        public Wektor Srodek
        {
            get { return srodek; }
            set { srodek = value; }
        }

        public float Promien
        {
            get { return promien; }
            set { promien = value; }
        }

        public override string ToString()
        {
            return "Sfera(" + srodek.X + "," + srodek.Y + "," + srodek.Z + " , " + promien + ")";
        }

        public override Kolor texDiff(Wektor kolizja)
        {
            Wektor koniec = kolizja - srodek;
            koniec.normalize();
            
            float theta = (float)Math.Acos(koniec.Y);
            float phi = (float)Math.Atan2(koniec.X, koniec.Z);
            if (phi < 0.0f) phi += 2 * (float)Math.PI;
            float u = phi * (float)Math.Pow(2*Math.PI, -1);
            float v = 1.0f - theta * (float)Math.Pow(Math.PI, -1);
            int x = (int)((material.Bit.Width-1) * u); // kolumna jest poziomo
            int y = (int)((material.Bit.Height-1) * v);
            Kolor k = new Kolor(material.Bit.GetPixel(x, y).R/255.0f, material.Bit.GetPixel(x, y).G/255.0f, material.Bit.GetPixel(x, y).B/255.0f);
            return k;
        }

        public override Wektor[] brylaOtaczajaca()
        {
            Wektor[] wierzcholki = new Wektor[2];
            wierzcholki[0] = new Wektor();
            wierzcholki[1] = new Wektor();
            wierzcholki[0].X = srodek.X - promien;
            wierzcholki[0].Y = srodek.Y - promien;
            wierzcholki[0].Z = srodek.Z - promien;
            wierzcholki[1].X = srodek.X + promien;
            wierzcholki[1].Y = srodek.Y + promien;
            wierzcholki[1].Z = srodek.Z + promien;
            return wierzcholki;
        }

        public override int IlePrzeciec(Promien p)
        {
            Wektor w = new Wektor(p.Start.X - srodek.X, p.Start.Y - srodek.Y, p.Start.Z - srodek.Z);
            float b = -w.dot(p.Kierunek);
            float det = b * b - w.dot(w) + promien * promien;
            if (det > 0)
            {
                det = (float)Math.Sqrt(det);
                float i1 = b - det;
                float i2 = b + det;
                if ((i1 > 0) && (i2 > 0))
                {
                    if (i1 < i2) p.setOdleglosc(this,i1);
                    else p.setOdleglosc(this,i2);
                    return 2;
                }
                else if (i1 > 0)
                {
                    p.setOdleglosc(this,i1);
                    return 1;
                }
                else if (i2 > 0)
                {
                    p.setOdleglosc(this,i2);
                    //Console.WriteLine(i2);
                    return 1;
                }
                else return 0;

            }
            else if (det == 0)
            {
                det = (float)Math.Sqrt(det);
                float i1 = b - det;
                if (i1 > 0)
                {
                    p.setOdleglosc(this,i1);
                    //Console.WriteLine(i1);
                    return 1;
                }
                else return 0;
            }
            else return 0;
            }
        }
    }
